﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Claro.QuestionModel;

namespace Claro.AdminInterface
{
    partial class frmSorteioGrupo : Form
    {
        private string QuantGrupo = "";
        clsEvento evento;

        //List<clsGrupo> grupos;
        List<clsAluno> alunos;

        public frmSorteioGrupo()
        {
            InitializeComponent();
            evento = clsEvento.getInstance();
            PreencherTiposGrupos();
            PreencherCursos();
           
        }

        private void PreencherTiposGrupos()
        {
            //Combo Tipos de nomes de grupos

            DataTable dt = clsTipoGrupos.SelecionarTipos();
            cboTipo.Tag = "0";
            cboTipo.DataSource = dt;
            cboTipo.DisplayMember = "nmTipo";
            cboTipo.ValueMember = "codTipo";
            cboTipo.Tag = "";
        }

        private void PreencherCursos()
        {
            //Combo Cursos
            cboCurso.DataSource = null;
            cboCurso.DataSource = clsCurso.SelecionarCursos();
            cboCurso.DisplayMember = "nmcurso";
            cboCurso.ValueMember = "codcurso";

            PreencherAlunos();
        }

        private void PreencherAlunos()
        {
            try
            {
                int codCurso = (int)cboCurso.SelectedValue;

                //Lista Alunos
                this.alunos = clsAluno.SelecionarAlunosPorCurso(codCurso);
                BindAlunos();
                //lstAlunos.Enabled = false;

                lblTotalAlunos.Text = "Total de Alunos: " + lstAlunos.Items.Count;
                ZerarTreeView();
            }
            catch (Exception)
            {

                
            }
        }

        private void BindAlunos()
        {
            lstAlunos.DataSource = null;
            lstAlunos.DataSource = alunos;
            lstAlunos.DisplayMember = "nmAluno";
            lstAlunos.ValueMember = "codAluno";
        }

        private void txtQuantGrupo_Leave(object sender, EventArgs e)
        {
            if (txtQuantGrupo.Text != QuantGrupo && txtQuantGrupo.Text != "")
            {
                QuantGrupo = txtQuantGrupo.Text;
                ZerarTreeView();
            }
        }

        /// <summary>
        /// Zera a treeview e a coleçao de grupos
        /// </summary>
        private void ZerarTreeView()
        {
            int tipoEscolhido = (int)cboTipo.SelectedValue;
            List<string> Nomes = clsTipoGrupos.SelecionarNomesGrupos(tipoEscolhido);
            
            if (Int32.Parse(QuantGrupo) > Nomes.Count)
            {
                MessageBox.Show("Existem mais grupos que sugestões de nomes disponíveis\nEscolha outro tipo de nomes para os grupos", "Atençao", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            
            trvGrupos.Nodes.Clear();
            evento.Grupos.Clear();
            for (int i = 0; i < lstAlunos.Items.Count -1; i++)
            {
                lstAlunos.SetSelected(i, false);
            }

            for (int i = 1; i <= Int32.Parse(QuantGrupo); i++)
            {
                clsGrupo G = new clsGrupo();
                G = new clsGrupo();

                G.nmGrupo = Nomes[i];
                evento.Grupos.Add(G);
                trvGrupos.Nodes.Add(G.nmGrupo);
            }         
        }

        private void btnSortear_Click(object sender, EventArgs e)
        {
            if (QuantGrupo == "" || QuantGrupo == "0")
            {
                MessageBox.Show("Quantidade de grupos inválida\nDigite um valor numérico maior que zero", "Atençao", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            PreencherAlunos();
            ZerarTreeView();

            lstAlunos.SelectionMode = SelectionMode.MultiSimple;
            int quantAlunos = lstAlunos.Items.Count;

                for (int i = 0; i <= quantAlunos-1; i++)
                {
                    //sorteia um aluno
                    Random rand = new Random();
                    int alunoSorteado = rand.Next(lstAlunos.Items.Count);

                    //tira o sorteado da lista
                    clsAluno aluno = (clsAluno)lstAlunos.Items[alunoSorteado];
                    alunos.Remove(aluno);
                    BindAlunos();

                    //sorteia um grupo com menos integrantes e coloca o aluno lá
                    int gruposorteado = sortearGrupo();
                    evento.Grupos[gruposorteado].Alunos.Add(aluno);
                    trvGrupos.Nodes[gruposorteado].Nodes.Add(aluno.codAluno.ToString(), aluno.nmAluno);
                    trvGrupos.Nodes[gruposorteado].Text = evento.Grupos[gruposorteado].nmGrupo + " - (" + trvGrupos.Nodes[gruposorteado].Nodes.Count.ToString() + " elementos)";
                    trvGrupos.ExpandAll();
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(500);
                }    
        }

        private int sortearGrupo()
        {
            Random rand = new Random();
            int n;
            bool valido;
            do
            {
                n = rand.Next(evento.Grupos.Count);
                valido = true;
                foreach (clsGrupo g in evento.Grupos)
                    if (evento.Grupos[n].Alunos.Count >= g.Alunos.Count + 1)
                    {
                        valido = false;
                        break;
                    }
            } while (! valido);
            return n;

        }

        private void cboCurso_SelectedIndexChanged(object sender, EventArgs e)
        {
            PreencherAlunos();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnIniciar_Click(object sender, EventArgs e)
        {
            evento.CriarGrupos();
            evento.Curso.codCurso = (int)cboCurso.SelectedValue;
            evento.AlterarCurso();
            frmAdmin f = new frmAdmin();
            f.Show();
            this.Close();

        }

        private void cboTipo_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboTipo.Tag.ToString() == "0" || QuantGrupo == "")
                return;
            ZerarTreeView();
        }

    }
}
